package com.foreveross.proxyip.infra.base.ddd.repository;

import java.io.Serializable;
import java.util.List;

import com.foreveross.proxyip.infra.base.ddd.domain.IBaseEntity;

/**
 * 数据访问层接口定义
 * @author xiangsf wdmz433xsf@gmail.com
 * @date 2012-9-8
 */
public interface IBaseRepository {
	/**
	 * 根据ID获取实体
	 * @param id
	 * @return
	 */
	public <T extends IBaseEntity> T  get(Class<T> clazz, Serializable id);
	
	/**
	 * 根据ID获取实体
	 * @param id
	 * @return
	 */
	public <T extends IBaseEntity> T  find(Class<T> clazz, Serializable id);
	
	/**
	 * 是否存在ID的实体
	* @return boolean
	 */
	public <T extends IBaseEntity> boolean  exists(Class<T> clazz, Serializable id);
	/**
	 * 获取实体列表
	 * @return
	 */
	public <T extends IBaseEntity> List<T> findAll(Class<T> clazz);
	/**
	 * 创建实体
	 * @param o
	 */
	public <T extends IBaseEntity> void create(T o);

	/**
	 * 更新实体
	 * @param o 实体对象
	 */
	public <T extends IBaseEntity> void update(T o);

	/**
	 * 根据ID删除实体对象
	 * @param id
	 */
	public <T extends IBaseEntity> void delete(Class<T> clazz, Serializable id);

	/**
	 * 删除实体对象
	 * @param o
	 */
	public <T extends IBaseEntity> void delete(T o);
	/**
	 * 保存实体对象
	 * @param o
	 */
	public <T extends IBaseEntity> void save(T o);
	/**
	 * 即时保存list
	 * @param entityList
	 */
	public  <T extends IBaseEntity >void transSaveList(List<T> entityList);
	
	public <T extends IBaseEntity > List<T> queryResult(final String queryStr, final Object[] params) ;
	
	/**
	 * 即时保存
	 * @param entityList
	 */
	public  <T extends IBaseEntity >void transSave(T o);
	
	/**
	 * 根据hql语句查询，支持分页
	 * @param queryStr
	 * @param params
	 * @param pageIndex  当前页码（从1开始）
	 * @param pageLen 每一页的长度（指每页显示多少条数据）
	 * @return
	 */
	public <T extends IBaseEntity > List<T> queryResult(final String queryStr, final Object[] params,int pageIndex,int pageLen);
	
	/**
	 * 根据hql语句查询得到的结果集数量(返回long类型的数量)
	 * @param queryStr(请保证数据库语句的正确 如 select count(a) from XX a)
	 * @param params
	 * @return
	 */
	public long queryResultSize(final String queryStr, final Object[] params);
	/**
	 * 执行hql
	 * @param hql
	 * @return
	 * @throws Exception
	 */
	public int execute(String hql,final Object[] params) throws Exception ;
}
